package com.jrx.anytxn.common.uitl;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collection;
import java.util.Objects;

/**
 * 数学工具类，由于数据中有大量的bigDecimal类型的数据计算以及
 * 比较因此在这里写个数字的工具类
 *
 * @author dengguoqing
 * @date 2018-09-15
 */
public class BigDecimalUtils {
    private BigDecimalUtils() {

    }

    /**
     * 比较两个bidDecimal数据的大小，若第一个数大于等于第二个返回true
     *
     * @param num1 num1
     * @param num2 num2
     * @return boolean
     */
    public static boolean compareBigDecimal(BigDecimal num1, BigDecimal num2) {
        Objects.requireNonNull(num1, "num1");
        Objects.requireNonNull(num2, "num2");
        return num1.compareTo(num2) >= 0;
    }

    /**
     * 比较一个 bidDecimal和零的大小
     *
     * @param bigDecimal bigDecimal
     * @return boolean
     */
    public static boolean compareToBigDecimalZero(BigDecimal bigDecimal) {
        Objects.requireNonNull(bigDecimal, "bigDecimal");
        return compareBigDecimal(bigDecimal, BigDecimal.ZERO);
    }

    /**
     * 集合数据求和
     *
     * @param collection BigDecimal集合
     * @return BigDecimal
     */
    public static BigDecimal sum(Collection<BigDecimal> collection) {
        if (null == collection || 0 == collection.size()) {
            throw new UnsupportedOperationException("不支持空集合操作");
        }
        return collection.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
    }

    /**
     * 数组求和
     *
     * @param bigDecimals bigDecimals
     * @return BigDecimal
     */
    public static BigDecimal sum(BigDecimal... bigDecimals) {
        if (null == bigDecimals || bigDecimals.length == 0) {
            throw new UnsupportedOperationException("不支持空数组操作");
        }
        return sum(Arrays.asList(bigDecimals));
    }

    /**
     * 对于bigdecimal类型的值进行格式化
     *
     * @param number
     * @return
     */
    public static BigDecimal formatNbr(BigDecimal number) {
        if (number == null) {
            return BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_HALF_UP);
        }
        return number.setScale(2, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 获取大于等于0的两值之差
     * @param num1
     * @param num2
     * @return
     */
    public static BigDecimal substract(BigDecimal num1, BigDecimal num2) {
        BigDecimal num3 = num1.subtract(num2);
        return num3.max(BigDecimal.ZERO);
    }


}
